因為只是要做最陽春的版本,所以只有一欄存輸入的網址,輸出的短網址就直接id,反正id不會重複。如果想要用亂碼當短網址就要再開一欄。
| id | original_address | 
|---|
以下是Laravel的migration,預設還有時間戳記,我就留著。
Schema::create('links', function (Blueprint $table) {
    $table->id();
    $table->string('original_adress');
    $table->timestamps();
});
get'/'就是輸入頁,post'/'就是把輸入的網址存進資料庫並回傳短網址。get'/<輸入的id>'就根據id導到對應的網站。
Route::get('/', function () {
    return view('input');
});
Route::get('/{id}',[App\Http\Controllers\LinkController::class,'redirect']);
Route::post('/',[App\Http\Controllers\LinkController::class,'store']);
我的model是叫Link,用Laravel創建的話是php artisan make:model Link。
同時創建migration和controller的話可以這樣:php artisan make:model Link -mc。
Link Model class 記得要把$guarded打開。
protected $guarded=[];
Controller很簡單,就兩個功能:存(store)跟重導向(redirect)。
public function redirect()
{
	$id = (trim($_SERVER['REQUEST_URI'],'/'));
	$address = Link::where('id',$id)->firstOrFail()->original_adress;
	return header("Location:". $address);
}
public function store()
{
	//檢查輸入網址是否之前輸入過,如果有就回傳之前的結果,
	//避免資料庫存入大量同樣網址。
	if(Link::where('original_adress',request('original_address'))->first()!= Null)
	{
		$link = Link::where('original_adress',request('original_address'))->firstOrFail();
		return view('input',[
			'link'=>$link
		]);
	//如果是新的網址,就新增一筆資料並把那筆資料也傳到前端。
	}else{
		$link = Link::create([
		'original_adress'=>request('original_address')
		]);
		return view('input',[
			'link'=>$link
		]);
	}
}
前端只有輸入原網址欄和輸出結果短網址。
我的頁面檔input.blade.php:
<h1>URL shortener</h1>
<form action="/" method="post">
	@csrf
	<input type="text" name="original_address" required>
	<input type="submit">
</form>
@if(isset($link))
	<div class="result">
		<p>Result link:<a 
			href="http://urlshortener.test/{{$link->id}}">
			http://urlshortener.test/{{$link->id}}</a>
		</p>
	</div>
@endif
成品像這樣
https://imgur.com/4FwBT1s
想玩更多,可以加入計算點擊的功能,紀錄多少人透過網站導流。